package com.zlm.tools.util.stream;

import cn.hutool.core.lang.Pair;

import java.util.Optional;
import java.util.function.Function;

/**
 * 流处理正常数据异常数据接受类
 *
 * @author zlm
 * @date 2023/8/18
 */
public class EitherUtil<L,R> {
    /**
     * 异常数据
     */
    private final L left;
    /**
     * 正常数据
     */
    private final R right;

    public EitherUtil(L left, R right) {
        this.left = left;
        this.right = right;
    }

    public static <T,R> Function<T,EitherUtil> leftWithValue(CheckFunction<T,R> function){
        return t -> {
            try {
                return EitherUtil.createRight(function.apply(t));
            } catch (Exception e) {
                return EitherUtil.creatLeft(Pair.of(e,t));
            }
        };
    }

    /**
     * 创建异常接受类
     * @param value 异常数据
     *
     */
    public static <L,R> EitherUtil<L,R> creatLeft(L value){
        return new EitherUtil<>(value,null);
    }
    /**
     * 创建正常接受类
     * @param value 正常数据
     *
     */
    public static <L,R> EitherUtil<L,R> createRight(R value){
        return new EitherUtil<>(null,value);
    }
    public Optional<L> getLeft(){
        return Optional.ofNullable(left);
    }
    public Optional<R> getRight(){
        return Optional.ofNullable(right);
    }


}
